package com.example.myspringai.controller;


import com.example.myspringai.entity.Completion;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/example/ai")
public class StuffController {

    private final ChatClient chatClient;

    @Value("classpath:/docs/bailian.md")
    private Resource docsToStuffResource;

    @Value("classpath:/prompts/qa-prompt.st")
    private Resource qaPromptResource;

    @Autowired
    public StuffController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    @GetMapping(value = "/stuff")
    public Completion completion(@RequestParam(value = "message", defaultValue = "给我推荐一款百炼系列的手机？") String message, @RequestParam(value = "stuffit", defaultValue = "false") boolean stuffit) {

        PromptTemplate promptTemplate = new PromptTemplate(qaPromptResource);

        Map<String, Object> map = new HashMap<>();
        map.put("question", message);
        if (stuffit) {
            map.put("context", docsToStuffResource);
        } else {
            map.put("context", "");
        }

        return new Completion(chatClient.prompt(promptTemplate.create(map)).call().content());
    }

    /**
     * 提示词模板与RAG的区别
     * 当前实现的方式：
     * 1.属于“文档预加载+条件触发”模式
     * 2.通过stuffit参数实现人工控制的上下问开关
     * 3.本质上是一种轻量级的静态RAG(Static RAG)
     *
     * 经典RAG:
     * 1.采用“检索-排序-注入”自动化流程
     * 2.依赖向量相似度计算东岱选择上下文
     * 3.支持增量学习和实时知识更新
     * 4.典型流程：问题编码->向量检索->向量排序->相关性过滤->上下文森注入适用场景建议
     *
     * 当前方式适合:
     * 1.文档规模小（如产品说明书、FAQ等）
     * 2.需要严格控制的回答范围
     * 3.快速原型开发阶段
     */

}
